package org.zetaframework.base.excel.convert;

import cn.idev.excel.converters.Converter;
import cn.idev.excel.enums.CellDataTypeEnum;
import cn.idev.excel.metadata.GlobalConfiguration;
import cn.idev.excel.metadata.data.ReadCellData;
import cn.idev.excel.metadata.data.WriteCellData;
import cn.idev.excel.metadata.property.ExcelContentProperty;
import cn.idev.excel.util.DateUtils;

import java.time.LocalDate;

/**
 * 自定义Excel中的LocalDate转换器
 * <p>
 * 说明：
 * <pre>
 * 使用fastExcel提供的LocalDate转换器会报错
 * "Convert data cn.idev.excel.metadata.data.ReadCellData to class java.time.LocalDate error"
 * 测试显示读取的excel中日期字段的值会被存储为BigDecimal
 * 故自定义了一个LocalDate转换器
 * </pre>
 *
 * @author gcc
 */
public class LocalDateConverter implements Converter<LocalDate> {

    /**
     * 返回 Java 中的对象类型
     *
     * @return Support for Java class
     */
    @Override
    public Class<?> supportJavaTypeKey() {
        return LocalDate.class;
    }

    /**
     * 返回 excel 中的对象枚举
     *
     * @return Support for {@link CellDataTypeEnum}
     */
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }


    /**
     * 将 excel 对象转换为 Java 对象
     *
     * @param cellData            Excel 单元格数据。不为空
     * @param contentProperty     上下文属性。可空
     * @param globalConfiguration 全局配置。不为空
     * @return 要放入 Java 对象的数据
     * @throws Exception Exception.
     */
    @Override
    public LocalDate convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // 判断是否是数字类型
        if (CellDataTypeEnum.NUMBER.equals(cellData.getType())) {
            LocalDate localDate = LocalDate.of(1900, 1, 1);
            return localDate.plusDays(cellData.getNumberValue().longValue() - 2);
        }

        // 否则判断是否是字符串类型。 判断字段上是否有@DateTimeFormat注解
        if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {
            return DateUtils.parseLocalDate(cellData.getStringValue(), null, globalConfiguration.getLocale());
        }
        return DateUtils.parseLocalDate(cellData.getStringValue(),
                contentProperty.getDateTimeFormatProperty().getFormat(), globalConfiguration.getLocale());
    }

    /**
     * 将 Java 对象转换为 excel 对象
     *
     * @param value               Java 数据。不为空
     * @param contentProperty     上下文属性。可空
     * @param globalConfiguration 全局配置。不为空
     * @return 要放入 Excel 的数据
     * @throws Exception Exception.
     */
    @Override
    public WriteCellData<?> convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // 判断字段上是否有@DateTimeFormat注解
        if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {
            return new WriteCellData<>(DateUtils.format(value, null, globalConfiguration.getLocale()));
        } else {
            return new WriteCellData<>(
                    DateUtils.format(value, contentProperty.getDateTimeFormatProperty().getFormat(),
                            globalConfiguration.getLocale()));
        }
    }
}
